逻辑运算符“&&”、“||”是对操作数进行布尔算术运算,我们经常碰到的是和关系运算符配合使用的情况。但是对真值和假值的布尔操作却了解不多。下面我们就从三个层次加深对逻辑运算符的理解。

1.连接两个关系表达式(操作数总是布尔值)

关系运算符: “==”、“===”、“!==”、“!===”、“<”、“<=”、“>”和“>=”用于测试两个值之间的关系,关系表达式总是返回一个布尔值。

x == 1 && y==2     //只有都为true的时候,结果才是true

2.连接真值或假值

除了false、null、undefined、0、-0、NaN和"" 外,
其他的值包括所有对象都是真值

当“&&” 对真值进行布尔操作时,只有当两个操作数都是真值时,才返回一个真值。注意返回的是一个真值而不是true。否则,至少一个是假值时则返回假值。

3.返回的真值或假值是什么

进行“&&”操作时,运算符首先计算左操作数的值,如果是假值,那么就返回这个假值。如果是真值,那么表达式的结果就依赖于右操作数的值,如果右操作数为真值,那么结果就返回这个真值,如果是假值,就返回这个假值。也就是说,当左操作数是真值时,“&&”运算符将右操作数的值作为整个表达式的结果。

我们可以利用后两点进行一些复杂表达式运算。

if(a>5){
    alert("yes");
}
等价于
a>5 && alert("yes");

来个复杂点的。下面是一个很常见的条件判断语句,我们经常用if…elseif…else语句,或者是switch语句

var b;
if(a == 5){
    b = 1;
}
else if(a == 10){
    b = 2;
}
else if(a == 12){
    b = 3;
}
else if(a == 15){
    b = 4;
}
else {
    b = 0;
}
等价于
var b;
switch(a){
    case 5 : b = 1;
break;
    case 10 : b = 2;
break;
    case 12 : b = 3;
break;
    case 15 : b = 4;
break;
    default : b = 0;
break;
}

学习了逻辑运算符的另类应用,我们可以简单的这么写

var b = (a == 5 && 1) || (a == 10 && 2) || (a == 12 && 3) || (a == 15 && 4) || 0;
或者,更优化点代码,这么写
var b={'5':1,'10':2,'12':3,'15':4}[a] || 0;

因为对象的属性是一个具体的值,而不可能是一个范围,所以当我们遇到这种情况时,只能这么写了

var b = (a > 15 && 1) || (a > 12 && 2) || (a > 10 && 3) || (a > 5 && 4) || 0;

最后说下另外一个逻辑运算符 “!”

单独说“!”是因为它和“&&”与“||”不同,“!”运算符首先将操作数转换为布尔值,然后再对布尔值进行求反。因此“!”总是返回true或者false,并且,可以通过使用两次逻辑非运算来得到一个值的等价布尔值:!!x
这也是我们会经常发现if语句这么写的原因:if(!!x){…}